main(List<String> args) {
  // 1、明确声明
  String name = "dart";

  // 2、类型推导 (var/final/const)
  // 推导类型的方式算然没有明确指定变量类型，但是变量是有自己明确类型的

  // var声明变量
  var age = 18;
  // age = 'abc' 报错
  age = 30;

  // final声明常量
  final height = 1.88;
  // height = 2.00 报错

  const address = "上海市";
  // address = "江苏省";  报错

  // final和const区别
  // const必须赋值 常量值 （编译期间需要有一个确定的值）
  // final可以通过计算/函数获取一个值（运行期间来确定一个值）
  // const date1 = DateTime.now();  写法错误
  final date1 = DateTime.now();
  // final 用的多一点

  // p1和p2是不是同一个对象
  // final p1 = Person("dart");
  // final p2 = Person("dart");
  // print(identical(p1, p2));

  const p1 = Person("dart");
  const p2 = Person("dart");
  const p3 = Person("java");
  print(identical(p1, p2));
  print(identical(p2, p3));

  // dynamic/Object
  
}

// final写法
// class Person {
//   // 使用late关键字来允许字段在对象构造后的某个时间点进行初始化。注意，使用late意味着你必须确保字段在首次使用前被赋值，否则会导致运行时错误：
//   late String name;

//   Person(String name) {
//     this.name = name;
//   }
// }

class Person {
  // 语法糖写法
  final String name;
  const Person(this.name);
}
